iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
AI & Data

AI 營養師 + Web3 數位健康護照系列 第 22

Day22. Flask 與資料庫整合 Ep1:Flask、SQLite 與 SQLAlchemy「夠用就好」的佛系開發哲學

  • 分享至 

  • xImage
  •  

《道德經》有云:「執大象,天下往;往而不害,安平太。」Flask,雖微而不弱,取其能「無為」而能「有為」之意。常見開發者埋首 SQL 繁文,逐字排查,不勝其擾。老子謂:「多言數窮,不如守中。」於是 SQLAlchemy ORM 之道,應運而生。

以 Python 編織數據之象,每一表皆類,每一欄皆屬,創建猶如生新物於無形。增刪查改,不必江湖刀劍,只需安坐堂中,命運隨意。對象入 session,操作皆如行雲流水。取數據如取甘霖;無須涉險 SQL 原野,不需頻頻釋義,技術正成為生活之道,回歸人心,順其自然而已。

世人慣以效率為高,計較傷神;然大用無功,大象無形。Flask 如清風;SQLite 如稻田之榖;SQLAlchemy 便是灌溉的清泉。萬物生長,各得其所。Flask + SQLite + SQLAlchemy,何求名利?讓專案自然「活著」,呼吸自如。

Why「Flask + SQLite + SQLAlchemy」?

身為一個在鍵盤前燃燒生命的開發者,筆者深知時間就是每個人最寶貴的資產。在各種框架和資料庫的無限疊羅漢中,本人在最近學到了一個殘酷的真理:不要為了一個簡單的作品,把自己逼到需要去管資料庫的帳密、網路設定,以及連發五個 SQL 語句才能拿到一個使用者的名字。

這就是筆者為什麼在這次專案的資料庫直接實作 Flask + SQLite + SQLAlchemy 的原因:作品只需要活著,這套組合能讓它活得輕鬆優雅,不給人添麻煩。

SQLAlchemy ORM 的優勢

SQLite 是輕量級的關聯式資料庫,不需額外安裝伺服器,適合用於開發環境與中小型應用,是快速驗證與原型製作的首選。Flask 本身不內建 ORM,但 Flask-SQLAlchemy 提供了封裝良好的 SQLAlchemy 接口,讓開發者可以用高階物件操作資料庫,而不用直接寫 SQL。

SQLAlchemy 的極簡哲學:CRUD

1. 新增(Create):db.session.add() + commit()

# 1. 產生一個有血有肉的 Python 物件
new_user = User(username='tired_dev', email='dev@example.com')

# 2. 扔進 Session(想像成購物車,等待結帳)
db.session.add(new_user) 

# 3. 結帳 (原子性操作:要嘛成功,要嘛失敗,沒有中間狀態)
db.session.commit()

重點在 Session。資料寫入前,所有的操作都在這個「對話」中進行,一直到 commit(),資料才真正被寫入檔案。

2. 查詢(Read):用 Model.query 查詢,支持各類條件過濾與排序

# 找出所有名稱以 'A' 開頭的使用者,並按 ID 倒序排列,只要前 10 個
active_users = (
    User.query
    .filter(User.username.like('A%')) # 條件過濾
    .order_by(User.id.desc())         # 排序
    .limit(10)                        # 限制數量
    .all()                            # 執行查詢並獲取結果列表
)

# 找出 ID 為 5 的使用者,如果找不到就直接噴 404 錯誤 (Flask-SQLAlchemy 貼心服務)
important_user = User.query.get_or_404(5)

3. 更新(Update):找到物件,改屬性,然後 commit(),ORM 會自動追蹤改了什麼。

user = User.query.filter_by(username='tired_dev').first()

if user:
    # 直接修改 Python 物件的屬性,不用寫 UPDATE
    user.email = 'ITHelp2025xxx@gmail.com'
    
    # 提交。ORM 知道 email 變了,會自動生成 UPDATE 語句
    db.session.commit()

4. 刪除(Delete): db.session.delete() + commit()

user_to_delete = User.query.get(10) 

if user_to_delete:
    db.session.delete(user_to_delete)
    db.session.commit()

溫馨小提醒:
如果刪除前忘記 commit(),那麼這個物件只是在 Session 中被標記為「待刪除」,資料庫檔案還沒動。

Ref.


上一篇
Day21. 佛系生存法則:能實作 MCP 是本事,不炫技才是真高招。
下一篇
Day23. Flask 與資料庫整合 Ep2:練習用 SQLite 實作留言板功能(&單元測試)
系列文
AI 營養師 + Web3 數位健康護照27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言